package Inimigos 
{
	import adobe.utils.CustomActions;
	import Fases.FasesJogoParametros;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import TangoGames.Atores.*;
	import TangoGames.Utils;
	
	/**
	 * ...
	 * @author Arthur&Honorato
	 */
	public class Inimigo extends AtorBase implements AtorInterface 
	{
		//constantes de estado do barco inimigo
		public static const ESTADO_SEM_ALVO        		:uint = 0;
		public static const ESTADO_PROCURANDO        	:uint = 1;
		public static const ESTADO_PERSEGUINDO_HEROI 	:uint = 2; 
		public static const ESTADO_FUGINDO			  	:uint = 3; 
		public static const ESTADO_ATACANDO_HEROI  		:uint = 4; 
		public static const ESTADO_MORRENDO  			:uint = 5; 
		
		//estado
		private var UI_estado					:uint = 0;
		private var UI_frames					:uint = 0;
		private var UI_randonframes				:uint = 0;
		
		//direção do fantasma
		public static const DIRECAO_CIMA		:uint	=  1;
		public static const DIRECAO_BAIXO		:uint	=  2;
		public static const DIRECAO_DIREITA		:uint 	=  3;
		public static const DIRECAO_ESQUERDA	:uint 	=  4;
		
		//imagem do Barco
		private var MC_fantasma		:MovieClip;
		
		//velocidade
		private var NU_veloc		:Number;
		private var NU_velX			:Number;
		private var NU_velY			:Number;
		
		//direção
		private var NU_angDir		:Number;
		private var UI_Direc		:uint;
		
		//Heroi
		private var AT_Alvo:AtorBase;
		
		//aumento de batimentos por susto
		private var UI_batimentos_susto:uint;
		
		public function Inimigo() 
		{
			if (Utils.Rnd(1, 10) > 5 )
			{ MC_fantasma =  new Fantasma1;	}
			else
			{ MC_fantasma =  new Fantasma2;	}
			
			gerarEventoStage = true;
			this.addEventListener(AtorEvent.ATOR_SAIU_STAGE, OnSaiuStage, false,0,true);
			
			super(MC_fantasma);
			this.alpha = 0.01;
			iniciaAnima(MC_fantasma, "cima")
		}
		
		/* INTERFACE TangoGames.Atores.AtorInterface */
		
		public function inicializa():void 
		{   
			//Velociade dos inimigos
			NU_veloc = faseAtor.param[FasesJogoParametros.PARAM_INIMIGOS_VELOC_MAX];
			
			//Inicializa batimentos do susto
			UI_batimentos_susto= this.faseAtor.param[FasesJogoParametros.PARAM_BATIMENTOS_CARDIACO_SUSTO];
				
			calcularRota()
			
		}
		
		private function OnSaiuStage(e:AtorEvent):void 
		{
			UI_estado = 0;
		}
		
		public function reinicializa():void 
		{
		}
		
		public function update(e:Event):void 
		{			
			UI_frames++;
			
			switch (UI_estado) 
			{
				case ESTADO_SEM_ALVO:
					NU_angDir = Math.atan2( (stage.stageHeight / 2) - this.y , (stage.stageWidth / 2 ) - this.x);
					NU_velX =  Math.cos(NU_angDir) * NU_veloc;
					NU_velY =  Math.sin(NU_angDir) * NU_veloc;
					UI_estado = ESTADO_PROCURANDO;
					UI_randonframes = Utils.Rnd(150, 300);
					UI_frames = 0;
				break;
				
				case ESTADO_PROCURANDO:
					if (UI_randonframes < UI_frames) 
					{
						UI_estado = ESTADO_PERSEGUINDO_HEROI;
						UI_frames = 0;
					}
				break;
				
				case ESTADO_PERSEGUINDO_HEROI:
					calcularRota();
				break;
				
				case ESTADO_FUGINDO:
					if (UI_randonframes < UI_frames) 
					{
						UI_estado = ESTADO_PERSEGUINDO_HEROI;
						UI_frames = 0;
					}
				break;
				
				case ESTADO_ATACANDO_HEROI:
					NU_velX = 0;
					NU_velY = 0;
					if (30 < UI_frames) this.marcadoRemocao = true;
					this.visible = !this.visible;
				break;
				
				case ESTADO_MORRENDO :
					NU_velX = 0;
					NU_velY = 0;
					if (60 < UI_frames) this.marcadoRemocao = true;
					if (MC_fantasma.currentFrameLabel == "fumacafim") {
						paraAnima("fumacafim");
						alpha -= 0.1;
					}
				break;
				
				default:
			}
			
			this.x += NU_velX;
			this.y += NU_velY;
			
			if (UI_estado != ESTADO_MORRENDO) 
			{
				atualiza_Animacao();
				controleAnima();	
			}
			
			
			if ( (this.alpha >= 1) && (UI_estado != ESTADO_MORRENDO) && (UI_estado != ESTADO_ATACANDO_HEROI ))
			{
				trocaAnima("fumaca");				
				UI_estado = ESTADO_MORRENDO ;
				UI_frames = 0;
			}
			
     	}
		

		public function remove():void 
		{
			
		}
		
		/*************************************************************
		/**** Colisão
		/*************************************************************/
		
		public function colidiu(ator:AtorBase)
		{
			if (UI_estado != ESTADO_MORRENDO && UI_estado != ESTADO_ATACANDO_HEROI ) 
			{
				NU_angDir = Math.atan2( this.y - ator.y  , this.x - ator.x);
				NU_velX =  Math.cos(NU_angDir) * NU_veloc;
				NU_velY =  Math.sin(NU_angDir) * NU_veloc;
				
				UI_estado = ESTADO_PROCURANDO;
			
				UI_frames = 0 ;
			
				UI_randonframes = Utils.Rnd (100, 200);
			
				if (ator is LuzAtor ) 
				{
					UI_estado = ESTADO_FUGINDO ;
				
					this.alpha += 0.03;
				
				}
			}
		}
		
				
		public function assustou_Heroi()
		{
			UI_estado = ESTADO_ATACANDO_HEROI;
			UI_frames = 0;
			this.alpha = 1;
		}
		
		/*************************************************************
		/**** Movimentação do fantasma
		/*************************************************************/
		public function mover():void 
		{

		}
		
		private function calcularRota():void {
			if (AT_Alvo != null) 
			{
				NU_angDir = Math.atan2(AT_Alvo.y - this.y , AT_Alvo.x - this.x);
			}
			else
			{
				NU_angDir = (Math.random() * Math.PI) - (Math.random() * Math.PI);
			}
			NU_velX =  Math.cos(NU_angDir) * NU_veloc;
			NU_velY =  Math.sin(NU_angDir) * NU_veloc;
			
		}
		
		private function atualiza_Animacao()
		{
			UI_Direc = calculaDirecao(NU_angDir);
			
			switch (UI_Direc)
			{
				case DIRECAO_BAIXO:
					trocaAnima("baixo");
				break;
				
				case DIRECAO_CIMA:
					trocaAnima( "cima");				
				break;
				
				case DIRECAO_DIREITA:
					trocaAnima( "direita");
				break;
				
				case DIRECAO_ESQUERDA:
					trocaAnima( "esquerda");
				break;
				
			}
			
		}
		
		private function calculaDirecao(angrad:Number ):uint
		{
			var ang:Number = angrad * Utils.RADIANOS_TO_GRAUS;
			if (ang >=  -45 && ang <=   45) return DIRECAO_DIREITA;
			if (ang <=  -45 && ang >= -135) return DIRECAO_CIMA;
			if (ang >=   45 && ang <=  135) return DIRECAO_BAIXO;
			if ( (ang >= 135 && ang <= 180) || (ang <= -135 || ang >= -180 ) ) return DIRECAO_ESQUERDA;
			return DIRECAO_CIMA;
		}

		
		/*************************************************************
		 **** Moviemntação
		 ************************************************************
		

		 
		/*************************************************************
		/* Propriedades
		/* **********************************************************/
		
		/**
		 * Ator Alvo
		 */
		public function get Alvo():AtorBase 
		{
			return AT_Alvo;
		}
		
		public function set Alvo(value:AtorBase):void 
		{
			AT_Alvo = value;
		}
		
		public function get batimentos_susto():uint 
		{
			return UI_batimentos_susto;
		}
		
		public function get estado():uint 
		{
			return UI_estado;
		}
		
		
	}

}